/*************************************************************************
	> File Name: 001.邻接矩阵.cpp
	> Author: Maureen 
	> Mail: Maureen@qq.com 
	> Created Time: 日  5/16 23:19:23 2021
 ************************************************************************/

#include <iostream>
#include <cstring>
using namespace std;

int n; //点的个数
int m; //边的条数
int arr[105][105];

int main() {
    //初始化为0x3F的好处：该值大概为10亿多，int上限为21亿多，如果将该值 * 2还是没有超过int上限，所以当两个数相加的时候也不会超过int上限
    memset(arr, 0x3F,sizeof(arr)); //按照字节进行赋值，将邻接矩阵每个位置的值都初始化为极大值
    cin >> n >> m;
    for (int i = 0; i < m; i++) {
        int s, e, v; // s:起点，e:终点，v:权值
        cin >> s >> e >> v;
        arr[s][e] = min(v, arr[s][e]); //如果求最小路径，则保留重边中权值最小的那个
    }
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            if (arr[i][j] != 0x3F3F3F3F) {
                cout << arr[i][j] << " ";
            } else {
                cout << 0 << " ";
            }
        }
        cout << endl;
    }
    return 0;
}
